/** home,canvas load **/
function init()
{
    // IE&#xFF1A;Cache of bgIMG
    try {
        document.execCommand('BackgroundImageCache', false, true);
    } catch(e) {}

    // 板選択セレクトボックス生成
    createSelectBox();
        
    // igoogleアクセス時にデフォルトで表示する画面
    for (var i=0; i<THREAD_INFO.length; i++){
        if (THREAD_INFO[i].id == DEFAULT_CATEGORY){
            var default_disp_flg = true;
            break;
        }
    }
    if (DEFAULT_CATEGORY != -1 && default_disp_flg){
        selectCategory(DEFAULT_CATEGORY);
    } else {
        createDefaultDisp();
    }
    
    // ガジェットサイズ調整
    gadgets.window.adjustHeight();
};

/** セレクトボックス生成 **/
function createSelectBox()
{
    var html = [];
    html.push('<select id="category" onchange="selectCategory(this.options[this.selectedIndex].value);">');
    var thread_info_cnt = THREAD_INFO.length;
    for (var i=0; i<thread_info_cnt; i++) {
        var thread_info = THREAD_INFO[i];
        var select = null;
        var select_class = null;
        if (DEFAULT_CATEGORY != -1 && DEFAULT_CATEGORY == THREAD_INFO[i].id) select = "selected";
        var option  = '<option id="' + THREAD_INFO[i].id + '" + value="'+ THREAD_INFO[i].id +'"' + select + '>';
            option += THREAD_INFO[i].category;
            option += '</option>';
        html.push(option);
    }
    html.push('</select>');

    var select_rss_container = document.getElementById("select_rss");
    select_rss_container.innerHTML = html.join("");
    
    return;
};

/** 初期表示時、説明カテゴリ選択時の画面生成 **/
function createDefaultDisp()
{
    // title
    var rssTitle = THREAD_INFO[0].title_category;
    var rss_title = document.getElementById("rss_title");
    rss_title.innerHTML = '<span class="warn">' + rssTitle + '</span>';

    // search_box 検索ボックスは必要ないので削除
    var select_form_container = document.getElementById('select_form');
    select_form_container.innerHTML = "";

    // container
    createIntroduction();
    gadgets.window.adjustHeight();
    PROCESS_FLG = 0;
    
    return;
};

/** 操作説明タグ生成 **/
function createIntroduction()
{
    var intro_tags = '';
    intro_tags  = '<br/>';
    intro_tags += '<span class="info">ガジェット枠右上「▼」アイコンを押下し、設定を編集を押下してください。</span>';
    intro_tags += '<br/><br/>';
    intro_tags += '<table id="intro">';
    intro_tags += '<tr>';
    intro_tags += '<th>スレッド表示数</th><td>1,3,5,10,15,20件の選択ができます。<br/>デフォルトは5件です。</td>';
    intro_tags += '</tr>';
    intro_tags += '<tr>';
    intro_tags += '<th>カテゴリ初期表示</th><td>ガジェットを表示したときに表示されるデフォルトサイトを指定できます。</td>';
    intro_tags += '</tr>';
    intro_tags += '<tr>';
    intro_tags += '<th>「日時」を表示</th><td>取得したスレッドが公開された日時を表示します。<br/>デフォルトは「表示する」です。</td>';
    intro_tags += '</tr>';
    intro_tags += '<tr>';
    intro_tags += '<th>「行間」を表示</th><td>スレッドの行間を詰めるか設定をします。<br/>デフォルトは「表示する」です。</td>';
    intro_tags += '</tr>';
    intro_tags += '<tr>';
    intro_tags += '<th>「検索機能」を表示</th><td>現表示スレッド検索機能を表示するか設定をします。<br/>デフォルトは「表示する」です。</td>';
    intro_tags += '</tr>';
    intro_tags += '<tr>';
    intro_tags += '<th>「各サイト」を表示</th><td>各サイトの表示非表示の設定をします。<br/>デフォルトは全て「表示する」です。<br/>また、カテゴリ初期表示で設定したサイトを非表示にすると<br/>デフォルトは当画面が開きます。</td>';
    intro_tags += '</tr>';
    intro_tags += '</table>';
    intro_tags += '<br/>';
    intro_tags += '<span class="info">設定が完了しましたら「保存」ボタンを押下してください。';

    var rss_container = document.getElementById("rss_container");
    rss_container.innerHTML = intro_tags;
    rss_container.style.display = 'block';
    
    return;
};

/** 検索ボックス生成 **/
function createFormTagsSelect(category_id)
{
    var html = [];
    var tags = '';
    if (SEARCH_DISP_FLG == false) return;
    if (category_id == -1){
        return;
    } else {
        var thread_info_cnt = THREAD_INFO.length;
        for (var i=0; i<thread_info_cnt; i++){
            if (THREAD_INFO[i].id == category_id){
                tags  = '<form id="category_search" name="cs" onsubmit="categorySearcher(); return false;" target="_blank">';
                tags += '<input type="hidden" id="searchSelect" value="' + category_id + '">';
                if (THREAD_INFO[i].search_url != ""){
                    tags += '<input type ="text" name="MT" id="mt" size="25" maxlength="255"><input type="submit" value="検索">';
                }
                tags += '</form>';
                html.push(tags);
            }
        }
    }
    return html;
};

/** ドリルボタン生成 **/
function toggleTags(name, target)
{
    if (PROCESS_FLG == 0) {
        var current_active = active[name];
        PROCESS_FLG = 1;

        // 行間調整
        var open_class_name = "frow_open";
        var close_class_name = "frow_close";
        if (BETWEEN_LINE_FLG != 1){
            open_class_name = "frow_open_no_between_line";
            close_class_name = "frow_close_no_between_line";
        }

        // 既に開いている行がある場合 
        if(current_active != -1) {
            var hideRow = document.getElementById('frow_' + name + current_active);
            hideRow.className = close_class_name;
            var hideObj = document.getElementById('fmsg_' + name + current_active);
            hideObj.style.display = 'none';
            var hideBtn = document.getElementById('fbtn_' + name + current_active);
            hideBtn.className = 'fbtn_plus';
        }

        if (target == current_active) {
            //開いていた行とクリックされた行が同じならば開閉状態を初期化 
            active[name] = -1;
        } else {
            //開いていた行と違う場合、クリックされた行を開く
            var dispRow = document.getElementById('frow_' + name + target);
            dispRow.className = open_class_name;
            var dispObj = document.getElementById('fmsg_' + name + target);
            dispObj.style.display = 'block';
            var dispBtn = document.getElementById('fbtn_' + name + target);
            dispBtn.className = 'fbtn_minus';
            active[name] = target;
        }

        gadgets.window.adjustHeight();
        PROCESS_FLG = 0;
    }
    return;
};

/** 板別検索機能 **/
function categorySearcher()
{
    var mt = document.getElementById('mt').value;
    
    if (mt == ''){
        return;
    } else {
        mt = encodeURIComponent(mt);
    }

    // カテゴリ別検索生成
    var selectCategoryId = document.getElementById('searchSelect').value;
    var url = '';
    var thread_info_cnt = THREAD_INFO.length;
    for (var i=0; i<thread_info_cnt; i++){
        if (THREAD_INFO[i].id == category_id){
            if (THREAD_INFO[i].search_url == ""){
                return;
            } else {
                url = THREAD_INFO[i].search_url;
                if (THREAD_INFO[i].encode_flg == true){
                    var decodeMT = UnescapeUTF8(mt);
                    mt = EscapeEUCJP(decodeMT);
                }
            }
        }
    }
    url += mt;
    window.open(url, '_blank');
    
    return;
};

/** カテゴリ選択時に表示する画面生成 **/
function selectCategory(category_id)
{
    if (!category_id) {
        gadgets.window.adjustHeight();
        return;
    }
        
    this.category_id = category_id;
    if (category_id == -1){
        // カテゴリ未選択状態時
        createDefaultDisp();
        return;
    } else {
        // 検索ボックス生成
        if (SEARCH_DISP_FLG == true){
            var select_form_container = document.getElementById('select_form');
            if (select_form_container != null || select_form_container != undefined){
                var formHTML = createFormTagsSelect(category_id);
                select_form_container.innerHTML = formHTML.join("");
            }
        }
    }

    // セレクトボックス内の現在表示している板名称を赤文字にする
    var thread_info_cnt = THREAD_INFO.length;
    for (var i=0; i<thread_info_cnt; i++){
        if (THREAD_INFO[i].id == category_id){
            var option_tags = document.getElementById(category_id);
            try {
                option_tags.className = "selected";
            } catch (e){
                option_tags.setAttribute('class','selected');
            }
            var feed_url = THREAD_INFO[i].rss_url;
        } else {
            var option_tags = document.getElementById(THREAD_INFO[i].id);
            try {
                option_tags.className = "";
            } catch (e){
                option_tags.setAttribute('class','');
            }
        }
    }

    var params = {};
    params[gadgets.io.RequestParameters.CONTENT_TYPE] = gadgets.io.ContentType.DOM;
    gadgets.io.makeRequest(feed_url, createRssContainer, params);
    
    return;
};

/** 取得したRSSをパースし、画面に表示する **/
function createRssContainer(obj)
{
    // 選択されたカテゴリ名のタイトルを出力
    category_id = this.category_id;
    var thread_info_cnt = THREAD_INFO.length;
    for (var i=0; i<thread_info_cnt; i++){
        if (THREAD_INFO[i].id == category_id){
            var rssTitle = THREAD_INFO[i].title_category;
            var site_url = THREAD_INFO[i].site_url;
        }
    }
    var rss_title = document.getElementById("rss_title");
    rss_title.innerHTML = '<span class="warn"><a href="' + site_url + '" target="_blank">' + rssTitle + '</a></span>';

    var rss_container = document.getElementById("rss_container");
    // RSS情報の取得状態チェック
    if (obj.errors != ""){
        rss_container.innerHTML = '<span class="warn">記事にエラーがあるため表示できません。<br />新しい記事が追加され、エラーが発生している記事が無くなれば、表示できるようになります。</span>';
        rss_container.style.display = 'block';
        gadgets.window.adjustHeight();
        PROCESS_FLG = 0;
        return;
    }
    var res = obj.data;
    if (res == null || typeof(res) != "object" || res.firstChild == null) {
        rss_container.innerHTML = '<span class="warn">情報の取得に失敗しました。</span>';
        rss_container.style.display = 'block';
        gadgets.window.adjustHeight();
        PROCESS_FLG = 0;
        return;
    }

    // RSS情報の存在チェック
    var item_list = null;
    if (category_id == 'majikichi'){
        item_list = getItemList2(res, DISP_CNT);
    } else {
        item_list = getItemList(res, DISP_CNT);
    }
    var item_cnt = item_list.length;
    if (item_cnt == 0) {
        rss_container.innerHTML = '<span class="warn">' + rssTitle + 'の更新情報はありません。</span>';
        rss_container.style.display = 'block';
        gadgets.window.adjustHeight();
        PROCESS_FLG = 0;
        return;
    }

    // RSSを元にタグを生成
    var html = '';

    for(var i = 0; i < item_cnt; i++) {
        var item = item_list[i];

        // date
        if (TIME_DISP_FLG == true){
            var dcdate = item["dc"];
            var date = dcParser(dcdate);
            html += '<span id="date">' + date + '</span>';
        }

        // link
        var link  = item["link"];

/*        
        // entries
        if (BUKUMA_DISP_FLG == true){
            var entry = HATENA_URL + link;
            html += '<span id="entry"><img src="' + entry + '" /></span>';
        }
*/

        // detail header
        // 行間調整
        var close_class_name = "frow_close";
        if (BETWEEN_LINE_FLG != 1){
            close_class_name = "frow_close_no_between_line";
        }
        html += '<div id="frow_new_rss'+i+'" class="' + close_class_name + '">';
        html += '<a id="fbtn_new_rss'+i+'" href="javascript:void(0);" class="fbtn_plus" onclick="toggleTags(\'new_rss\','+i+');" />';

        //title
        var title = item["title"];
        html += '<a href="' + _hesc(link) + '" title="' + _hesc(title) + '"target="_blank">';
        html += _hesc(title);
        html += '</a><br>';

        //contents
        var contents = item["contents"];
        var hit = contents.search(link);
        if(hit > 0){
            contents = contents.replace(link, link + '" target="_blank');
            // warotanikki bugfix
            if (category_id == 'warotanikki'){
                contents = contents.replace('align="left"', '');
            }
        }

        html += '<div id="fmsg_new_rss'+i+'" class="fmsg" style="display: none;">';
        html += contents;

        // kanasoku bugfix
        if (category_id != 'kanasoku'){
            html += '</div></div>';
        } else {
            html += '</div></div></div>';
        }        
    } //for loop end

    rss_container.innerHTML = html;
    rss_container.style.display = 'block';
    gadgets.window.adjustHeight();
    PROCESS_FLG = 0;
    
    return;
};

/** Ajax通信で取得したデータをパースする **/
function getItemList(res, loop_cnt)
{
    var result = [];
    var itemList = res.getElementsByTagName("item");

    if (loop_cnt > itemList.length) loop_cnt = itemList.length;
    for (var i = 0; i < loop_cnt ; i++) {
        var data = [];
        for(var j=0; j<loop_cnt; j++){
            data['title']    = retValue(itemList[i], 'title');
            data['link']     = retValue(itemList[i], 'link');
            data['contents'] = retValue(itemList[i], 'content:encoded');
            data['dc']       = retValue(itemList[i], 'dc:date');
        }
        result.push(data);
    }
    return result;
};

/** Ajax通信で取得したデータをパースする(atom用) **/
function getItemList2(res, loop_cnt)
{
    var result = [];
    var itemList = res.getElementsByTagName("entry");

    if (loop_cnt > itemList.length) loop_cnt = itemList.length;
    for (var i = 0; i < loop_cnt ; i++) {
        var data = [];
        for(var j=0; j<loop_cnt; j++){
            data['title']    = retValue(itemList[i], 'title');
            data['link']     = itemList[i].getElementsByTagName("link")[0].getAttribute("href");
            data['contents'] = retValue(itemList[i], 'content');
            data['dc']       = retValue(itemList[i], 'issued');
        }
        result.push(data);
    }
    return result;
};

/** DOMを詳細にパース **/
function retValue(elm,tag)
{
    tag = checkBrowser(tag);
    var t = elm.getElementsByTagName(tag)[0];
    if(t && t != undefined ){
        if(t.childNodes[1] != undefined ){
            if(t.childNodes[1]){
                if (t.childNodes[0].data.length != 1){
                    return t.childNodes[0].data;
                } else {
                    return t.childNodes[1].data;
                }
            }
            return '';
        } else {
            if(t.childNodes[0]){
                return t.childNodes[0].data;
            }
            return '';
        }
    }
    return '';
};
/** ブラウザチェック **/
function checkBrowser(tag)
{
    var getElemType = 0;
    var ua = navigator.userAgent.toLowerCase();
    var uaBrowserType = (ua.indexOf("opera") != -1 ||
                         ua.indexOf("chrome") != -1 ||
                         ua.indexOf("safari")!=-1 ||
                         ua.indexOf("firefox/2") != -1);

    if(uaBrowserType) getElemType = 1;
    if(getElemType == 1){
        var startNum = tag.indexOf(":") + 1;
        var tag = tag.substr(startNum);
    }
    return tag;
};

/** 時刻パース **/
function dcParser(string)
{
    var dateArray = string.split(/[^0-9]/);
    
    var dateCnt = dateArray.length
    if (dateCnt < 6 || dateCnt > 8) return;

    if(dateCnt == 7){
        if (string.chaAt(dateCnt -1) != "Z") return;
    }

    for(var i=0; i<dateCnt; i++){
        dateArray[i] = dateArray[i] - 0;
    }

    if(dateArray[0] < 1970 ||
        dateArray[1] < 1 || dateArray[1] > 12 ||
        dateArray[2] < 1 || dateArray[2] > 31 ||
        dateArray[3] < 0 || dateArray[3] > 23 ||
        dateArray[4] < 0 || dateArray[4] > 59 ||
        dateArray[5] < 0 || dateArray[5] > 60) {
        return;
    }
    
    if (dateArray[4] < 10){
        dateArray[4] = '0' + dateArray[4];
    }

    var date = dateArray[0]+'年'+dateArray[1]+'月'+dateArray[2]+'日 '+dateArray[3]+':'+dateArray[4];

    return date;
};
